home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
TUT19.ZIP
/
FIRE.ASM
next >
Wrap
Assembly Source File
|
1995-02-21
|
8KB
|
218 lines
DOSSEG ; Order the program to order it's segments in the
; same way that high level languages do.
.MODEL SMALL ; Different models :
; Tiny : Code + Data < 64k (can be made a COM file)
; Small : Code < 64k ; Data < 64k
; Medium : Code > 64k ; Data < 64k
; Compact: Code < 64k ; Data > 64k
; Large : Code > 64k ; Data > 64k
; Huge : Arrays > 64k
.286 ; Enable 286 instructions
.STACK 200h
.DATA ; Tells compiler that data is to follow.
endmessage db "This was the Fire Effect - denthor@beastie.cs.und.ac.za$"
; This is our end message. Must be terminated with a "$"
xsize = 80 ; The x-width of our screen in pixels
ysize = 112 ; The y-height of our screen in pixels, plus a few extra
randseed dw ? ; any number for randomness
pallette db 0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 8, 0, 0, 9, 0, 0,10
db 2, 0,10, 4, 0, 9, 6, 0, 9, 8, 0, 8,10, 0, 7,12, 0, 7,14, 0, 6,16, 0, 5
db 18, 0, 5,20, 0, 4,22, 0, 4,24, 0, 3,26, 0, 2,28, 0, 2,30, 0, 1,32, 0, 0
db 32, 0, 0,33, 0, 0,34, 0, 0,35, 0, 0,36, 0, 0,36, 0, 0,37, 0, 0,38, 0, 0
db 39, 0, 0,40, 0, 0,40, 0, 0,41, 0, 0,42, 0, 0,43, 0, 0,44, 0, 0,45, 0, 0
db 46, 1, 0,47, 1, 0,48, 2, 0,49, 2, 0,50, 3, 0,51, 3, 0,52, 4, 0,53, 4, 0
db 54, 5, 0,55, 5, 0,56, 6, 0,57, 6, 0,58, 7, 0,59, 7, 0,60, 8, 0,61, 8, 0
db 63, 9, 0,63, 9, 0,63,10, 0,63,10, 0,63,11, 0,63,11, 0,63,12, 0,63,12, 0
db 63,13, 0,63,13, 0,63,14, 0,63,14, 0,63,15, 0,63,15, 0,63,16, 0,63,16, 0
db 63,17, 0,63,17, 0,63,18, 0,63,18, 0,63,19, 0,63,19, 0,63,20, 0,63,20, 0
db 63,21, 0,63,21, 0,63,22, 0,63,22, 0,63,23, 0,63,24, 0,63,24, 0,63,25, 0
db 63,25, 0,63,26, 0,63,26, 0,63,27, 0,63,27, 0,63,28, 0,63,28, 0,63,29, 0
db 63,29, 0,63,30, 0,63,30, 0,63,31, 0,63,31, 0,63,32, 0,63,32, 0,63,33, 0
db 63,33, 0,63,34, 0,63,34, 0,63,35, 0,63,35, 0,63,36, 0,63,36, 0,63,37, 0
db 63,38, 0,63,38, 0,63,39, 0,63,39, 0,63,40, 0,63,40, 0,63,41, 0,63,41, 0
db 63,42, 0,63,42, 0,63,43, 0,63,43, 0,63,44, 0,63,44, 0,63,45, 0,63,45, 0
db 63,46, 0,63,46, 0,63,47, 0,63,47, 0,63,48, 0,63,48, 0,63,49, 0,63,49, 0
db 63,50, 0,63,50, 0,63,51, 0,63,52, 0,63,52, 0,63,52, 0,63,52, 0,63,52, 0
db 63,53, 0,63,53, 0,63,53, 0,63,53, 0,63,54, 0,63,54, 0,63,54, 0,63,54, 0
db 63,54, 0,63,55, 0,63,55, 0,63,55, 0,63,55, 0,63,56, 0,63,56, 0,63,56, 0
db 63,56, 0,63,57, 0,63,57, 0,63,57, 0,63,57, 0,63,57, 0,63,58, 0,63,58, 0
db 63,58, 0,63,58, 0,63,59, 0,63,59, 0,63,59, 0,63,59, 0,63,60, 0,63,60, 0
db 63,60, 0,63,60, 0,63,60, 0,63,61, 0,63,61, 0,63,61, 0,63,61, 0,63,62, 0
db 63,62, 0,63,62, 0,63,62, 0,63,63, 0,63,63, 1,63,63, 2,63,63, 3,63,63, 4
db 63,63, 5,63,63, 6,63,63, 7,63,63, 8,63,63, 9,63,63,10,63,63,10,63,63,11
db 63,63,12,63,63,13,63,63,14,63,63,15,63,63,16,63,63,17,63,63,18,63,63,19
db 63,63,20,63,63,21,63,63,21,63,63,22,63,63,23,63,63,24,63,63,25,63,63,26
db 63,63,27,63,63,28,63,63,29,63,63,30,63,63,31,63,63,31,63,63,32,63,63,33
db 63,63,34,63,63,35,63,63,36,63,63,37,63,63,38,63,63,39,63,63,40,63,63,41
db 63,63,42,63,63,42,63,63,43,63,63,44,63,63,45,63,63,46,63,63,47,63,63,48
db 63,63,49,63,63,50,63,63,51,63,63,52,63,63,52,63,63,53,63,63,54,63,63,55
db 63,63,56,63,63,57,63,63,58,63,63,59,63,63,60,63,63,61,63,63,62,63,63,63
; Our pallette ... generated elsewhere and brought in
screen db xsize*ysize dup (?) ; Virtual screen
.CODE ; Tells compiler that code is to follow.
Random proc near
mov ax,[RandSeed]
mov dx,8405h
mul dx ; ax*dx with result in dx:ax
inc ax
mov [RandSeed],ax
ret ; Return back to main section
Random endp
SetUpScreen proc near
mov ax,0013h
int 10h ; Get into 320x200x256 MCGA mode.
mov ax,0a000h
mov es,ax
xor di,di ; ES:DI is now pointing to the top left hand of the screen
cli
cld
mov dx,3c4h
mov ax,604h ; Enter unchained mode
out dx,ax
mov ax,0F02h ; All planes
out dx,ax
xor ax,ax
mov cx,32767
rep stosw ; Clear the screen
mov dx,3D4h
mov ax,14h ; Disable dword mode
out dx,ax
mov ax,0E317h ; Enable byte mode.
out dx,ax
out dx,ax
mov ax,00409h ; Cell height
out dx,ax
mov si, offset [pallette]
mov dx, 3c8h ; Pallette write register
mov al, 0
out dx, al ; Start at color zero
inc dx
mov cx, 768
@PalLoop :
outsb ; Write value to port; inc DI
dec cx
jnz @PalLoop
ret
SetUpScreen endp
START:
mov ax,@DATA
mov ds,ax ; Moves the segment of the data into DS.
call SetUpScreen
mov randseed,1234h
mov si,offset [screen]
mov cx,xsize*ysize
xor ax,ax
rep stosb ; Clear our virtual screen.
@MainLoop :
;
; This next bit puts either 0 or 255 along the very
; bottom row of our virtual screen.
;
mov si,offset [screen]
add si,xsize*ysize
sub si,xsize ; si=ofs(screen)+xsize*ysize-xsize ie. start of last row
mov cx,xsize ; loop the entire last row
xor dx,dx
@Newline :
call random
mov ds:[si],dl
inc si
dec cx
jnz @Newline
;
; This "softens" the values in the virtual array,
; creating a fire effect.
;
mov cx,xsize*ysize
sub cx,xsize
mov si,offset [screen]
add si,xsize
@FileLoop :
xor ax,ax
mov al,ds:[si]
add al,ds:[si+1]
adc ah,0
add al,ds:[si-1]
adc ah,0
add al,ds:[si+xsize]
adc ah,0
shr ax,2
jz @zero
dec ax
@Zero :
; al = ((pos)+(pos+1)+(pos-1)+(pos+80))/4 - 1
mov ds:[si-xsize],al
inc si
dec cx
jnz @FileLoop
;
; This dumps our virtual screen to the VGA screen.
;
mov dx, 3dah
l1:
in al, dx
and al, 8h
jnz l1
l2:
in al, dx
and al, 8h
jz l2
mov cx,xsize*ysize
shr cx,1
mov si,offset [screen]
xor di,di
rep movsw
mov ah,01
int 16h ; Has a key been pressed?
jz @MainLoop ; If not, carry on.
mov ah,0
int 16h ;get a key, returned in AX
;this is just to clear the keyboard buffer of the key
;press.
mov ax,0003h
int 10h ; Get into 80x25 text mode
mov dx,offset [endmessage]
mov ah,09h
int 21h ; Dos interrupt 21, subfunction 09 ... print string.
; DS:DX must be pointing to start of string.
mov ax,4c00h ; This function exits the program
int 21h ; and returns control to DOS.
END START